package com.zhss.demo.concurrent;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 * CyclicBarrier小例子:合并多个线程执行的结果
 */
public class CyclicBarrierDemo {
    public static void main(String[] args) {
        // 3:等待几个线程分别完成自己的工作之后
        CyclicBarrier barrier = new CyclicBarrier(3, new Runnable() {
            @Override
            public void run() {
                System.out.println("所有线程都完成了自己的任务，现在可以合并结果了");
            }
        });

        new Thread(() ->{
            try {
                System.out.println("线程1执行自己一部分工作........");
                barrier.await();
                System.out.println("最终结果合并完成，线程1可以推出.......");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
        }).start();

        new Thread(() ->{
            try {
                System.out.println("线程2执行自己一部分工作........");
                barrier.await();
                System.out.println("最终结果合并完成，线程2可以推出.......");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
        }).start();

        new Thread(() ->{
            try {
                System.out.println("线程3执行自己一部分工作........");
                barrier.await();
                System.out.println("最终结果合并完成，线程3可以推出.......");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
        }).start();
    }
}
